/*
 * @Author: 胡海
 * @Date: 2019-11-20 21:52:35
 * @LastEditors: 胡海
 * @LastEditTime: 2020-03-07 11:52:28
 * @Description: 
 */
import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css' // Progress 进度条样式
import {
  Message
} from 'element-ui'
import {
  getToken,
  removeToken
} from '@/utils/auth' // 验权
import {
  getInfo
} from '@/api/user'
import {
  filter_router,
  filter_menu
} from '@/utils/common'
import {
  constantRouterMap
} from '@/router'

const whiteList = ['/login'] // 不重定向白名单
const noPage = [{
  path: '*',
  redirect: '/404',
}] // 如果没有路由就显示404 页面

router.beforeEach(async (to, from, next) => {
  /* 1.如果我的浏览器有token的话
     如果我的路由定义到login，那么让它直接跳转到首页
     如果不是login路由，那么就要调用拉取用户信息接口
     如果拉取用户信息失败，那么就调用退出接口
     然后重新登录，重新走一遍
     2.如果我的浏览器没有token的话，直接跳转到login 页面

     3.根据state roles来判断是否拉取过用户信息，如果是，直接下一步
  */
  NProgress.start()
  if (getToken()) {
    if (to.path === '/login') {
      next({
        path: '/'
      })
      NProgress.done() // 如果当前页面是仪表板，则在每次挂接后都不会触发，因此请手动处理
    } else {
      if (store.getters.roles.length === 0) {
        let data = await _userInfo()
        if (data) {
          _setStore(data)
          // hack方法，以确保addRoutes是完整的
          // 设置replace：true，因此导航将不会留下历史记录
          next({
            ...to,
            replace: true
          })
        } else {
          Message.error('身份验证失败，请重新登录')
          removeToken()
          next({
            path: '/login'
          })
          NProgress.done()
        }
      } else {
        next()
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      console.log('wocuol')
      next('/login')
      NProgress.done()
    }
  }
})

function _userInfo() { // 用户信息
  return new Promise(function (reslove, reject) {
    getInfo().then(res => {
        if (res.error_code === 0) {
          reslove(res.data)
        } else {
          console.log('你获取用户信息的时候后端出错')
        }
      })
      .catch(err => {
        reslove(false)
      })
  })
}

function _setStore(data) { // 仓库
  store.commit('SET_ROLES', data.routes)
  store.commit('set_userInfo', data.user)

  // 根据后端的routers生成可访问的路由
  let accessRoutes = filter_router(data.routes, constantRouterMap)
  // 添加动态路由
  router.addRoutes(accessRoutes.concat(noPage))
  let menuData = filter_menu(accessRoutes)
  store.commit('SET_ROUTES', menuData)
}

router.afterEach(() => {
  NProgress.done() // 结束Progress
})
